     ___     ___          ___     ___          ___        ___         ___
    /  /\   /__/\        /  /\   /__/\        /  /\      /  /\       /  /\
   /  /:/   \  \:\      /  /::\  \  \:\      /  /::\    /  /::\     /  /::|
  /  /:/     \  \:\    /  /:/\:\  \  \:\    /  /:/\:\  /  /:/\:\   /  /:|:|
 /  /::\ ___  \__\:\  /  /::\ \:\  \__\:\  /  /::\ \:\/  /::\ \:\ /  /:/|:|__
/__/:/\:\  /\ /  /::\/__/:/\:\ \:\ /  /::\/__/:/\:\ \/__/:/\:\_\:/__/:/_|::::\
\__\/  \:\/://  /:/\:\  \:\ \:\/://  /:/\:\  \:\ \:\_\__\/  \:\/:\__\/  /~~/:/
     \__\:://  /:/\ \:\  \:\ \:://  /:/\ \:\  \:\ \:\     \__\::/      /  /:/
     /  /://  /:/  \_\/\  \:\/://  /:/  \_\/\  \:\_\/     /  /:/      /  /:/
    /__/://__/:/        \  \:://__/:/        \  \:\      /__/:/      /__/:/
    \__\/ \__\/          \__\/ \__\/          \__\/      \__\/       \__\/
                                                               www.htb.prv.pl

Title:    [CrackMe.v1.0.by.CyBeRDeMoN........................................]
Topic:    [Cracking..........................................................]
Author:   [jopas......................]   E-mail: [mjoppek@wp.pl.............]
Packager: [jopas......................]   Date:   [22.06.2003................]
Homepage: [http://www.htb.prv.pl.&.http://www.asmpage.prv.pl.................]

        D  O  N  '  T     T  R  Y     T  O     B  E  A  T     U  S  !
______________________________________________________________________________

Bez wstepu  przechodzimy do  konkretow, o  CrackMe v  1.0 by  CyBeRDeMoN mozna
powiedziec, ze jest calkiem ciekawe i prosciutkie.

0177:004011CD  6A0D                PUSH      0D
0177:004011CF  68D6314000          PUSH      004031D6
0177:004011D4  FF35CE314000        PUSH      DWORD PTR [004031CE]
0177:004011DA  E8E9000000          CALL      USER32!GetWindowTextA
0177:004011DF  33F6                XOR       ESI,ESI
0177:004011E1  80B6D63140007F      XOR       BYTE PTR [ESI+004031D6],7F
0177:004011E8  46                  INC       ESI
0177:004011E9  83FE0C              CMP       ESI,0C
0177:004011EC  75F3                JNZ       004011E1

pobranie hasla i xor, jak widac musi byc 12 bajtow

0177:004011EE  33F6                XOR       ESI,ESI
0177:004011F0  BF0B000000          MOV       EDI,0000000B
0177:004011F5  8A86D6314000        MOV       AL,[ESI+004031D6]
0177:004011FB  8AA7D6314000        MOV       AH,[EDI+004031D6]
0177:00401201  32C4                XOR       AL,AH
0177:00401203  8886EE314000        MOV       [ESI+004031EE],AL
0177:00401209  46                  INC       ESI
0177:0040120A  4F                  DEC       EDI
0177:0040120B  83FE06              CMP       ESI,06
0177:0040120E  75E5                JNZ       004011F5

xor - pierwszy  z ostatnim, drugi z  przed  ostatnim itd. przez  co haslo jest
krotsze o polowe (6 bajtow)

0177:00401210  B903000000          MOV       ECX,00000003
0177:00401215  33F6                XOR       ESI,ESI
0177:00401217  BF05000000          MOV       EDI,00000005
0177:0040121C  8A86EE314000        MOV       AL,[ESI+004031EE]
0177:00401222  8AA7EE314000        MOV       AH,[EDI+004031EE]
0177:00401228  32C4                XOR       AL,AH
0177:0040122A  8886F4314000        MOV       [ESI+004031F4],AL
0177:00401230  46                  INC       ESI
0177:00401231  4F                  DEC       EDI
0177:00401232  E2E8                LOOP      0040121C

jw. haslo= 3bajty

0177:00401234  A0F4314000          MOV       AL,[004031F4]
0177:00401239  0205F5314000        ADD       AL,[004031F5]
0177:0040123F  2A05F6314000        SUB       AL,[004031F6]
0177:00401245  66B90C00            MOV       CX,000C
0177:00401249  33F6                XOR       ESI,ESI
0177:0040124B  3086D6314000        XOR       [ESI+004031D6],AL
0177:00401251  46                  INC       ESI
0177:00401252  E2F7                LOOP      0040124B

nasze haslo ma teraz 3 bajty,
(1bajt+2bajt-3bajt) xor haslem 12bajtowym (ten co wpisalismy do edit'a)

0177:00401254  33F6                XOR       ESI,ESI
0177:00401256  B90C000000          MOV       ECX,0000000C
0177:0040125B  8A862F304000        MOV       AL,[ESI+0040302F]
0177:00401261  3A86D6314000        CMP       AL,[ESI+004031D6]
0177:00401267  751B                JNZ       00401284
0177:00401269  46                  INC       ESI
0177:0040126A  E2EF                LOOP      0040125B

nasze zmielone haslo musi byc rowne z tablica spod .40302fh

Moim  zdaniem  jedynym  rozsadnym  rozwiazaniem  jest  sprawdzenie  wszystkich
mozliwosci,  tzw. brutal  force, przeciez  to tylko  12bajtow ;-P  czyli cala
wiecznosc.
Tak na prawde jest tylko 255 mozliwosci, dlaczego? A no dlatego:

podane przez  nas haslo  jest zmielone  do jednego  bajtu, nastepnie 12bajtowe
haslo jest xorowane z tym jednym bajtem i musi dac nam takie same bajty jak  w
tablicy  spod 40302fh.  Skoro jest  xorowane z  1bajtem mamy  255 mozliwosci,
proste co nie?

Jak  cos  jest  niezrozumiale  to  mam  nadzieje,  ze  to  rozwieje   wszelkie
watpliwosci  (nie optymalizowalem  kodu, chcialem  zeby bardziej  przypominalo
oryginal, przez co bedzie bardziej zrozumiale), oto skromny brut:

.586
.model flat,stdcall
option casemap:none

.data
x       db 09h,2ch,3fh,26h,6dh,0ch,3bh,28h,23h,2ah,28h,3fh
y       db 0ch dup (0)
z       db 06h dup (0)
_aaa    db 03h dup (0)

.code
start:
int 3

    xor     eax,eax
    
_go:
    xor     esi,esi
    
_:
    inc     eax
    push    eax
_1:
    mov     ah,byte ptr[esi+x]
    xor     ah,al
    mov     byte ptr[esi+y],ah
    inc     esi
    cmp     esi,0ch
    jnz     _1

    xor     esi,esi
    mov     edi,0bh

_2:
    mov     al,byte ptr[esi+y]
    mov     ah,byte ptr[edi+y]
    xor     al,ah
    mov     byte ptr[esi+z],al
    inc     esi
    dec     edi
    cmp     esi,6
    jnz     _2

    mov     ecx,3
    xor     esi,esi
    mov     edi,5

_3:
    mov     al,byte ptr[esi+z]
    mov     ah,byte ptr[edi+z]
    xor     al,ah
    mov     byte ptr[esi+_aaa],al
    inc     esi
    dec     edi
    loop    _3

    mov     bl,byte ptr[_aaa]
    add     bl,byte ptr[_aaa+1]
    sub     bl,byte ptr[_aaa+2]

    pop     eax
    cmp     al,bl
    jnz     _go
    
    int     3
    ret
end start

tablica x = tablica z crackme  (tak musi wygladac zmielone haslo) trzeba  miec
wlaczona obsluge int 3 (si98= set  i3here on, siNT= i3here on), prog  sprawdza
wszystkie mozliwosci, trwa to m/w niecala sekunde ;-) u mnie zatrzymalo sie na
32h. Co oznacza, ze poprawny serial  po przepuszczeniu  przez procke z crackme
musi dac liczbe 32h.

Oto drugi prog, ktory da nam poprawne haslo:

.586
.model flat,stdcall
option casemap:none

.data
x   db 09h,2ch,3fh,26h,6dh,0ch,3bh,28h,23h,2ah,28h,3fh

.code
start:
int 3

    xor     esi,esi
    push    0ch
    pop     ecx
    push    ecx

_1:
    xor     byte ptr[esi+x],32h
    inc     esi
    loop    _1

    pop     ecx
    xor     esi,esi

_2:
    xor     byte ptr[esi+x],7fh
    inc     esi
    loop    _2

    int     3

ret
end start

Poprawne haslo to: Dark Avenger
_____________
jopas
mjoppek@wp.pl